package com.itheima;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * bean作用域
 * <p>
 * Spring支持五种作用域，后三种在web环境才生效：
 * <p>
 * 作用域      	说明
 * singleton	容器内同 名称 的 bean 只有一个实例（单例）（默认）
 * prototype	每次使用该 bean 时会创建新的实例（非单例,注意非单例不是多例,多例是几个固定的独享,非单例是无限个）
 * request  	每个请求范围内会创建新的实例（web环境中，了解）
 * session  	每个会话范围内会创建新的实例（web环境中，了解）
 * application	每个应用范围内会创建新的实例（web环境中，了解）
 * <p>
 * 可以通过 @Scope 注解来进行配置作用域：
 *
 * @Scope("prototype")
 * @RestController
 * @RequestMapping("/depts") public class DeptController {
 * <p>
 * }
 */
/*
@Scope("singleton")与@Scope("prototype")除了Spring产生对象时单例/非单例的区别,还有一点重要区别是:对象产生的实际不同,当bean作用域为singleton时,即便没有"依赖注入"使用该类实例,在SpringIOC容器创建的同时就产生唯一单例了(我们可以通过观察MyBean类的构造函数执行情况来得知究竟什么时候创建了实例);当bean作用域为prototype时,只有"依赖注入"等使用实例时才会创建实例,实例个数不限

注意:
默认singleton的bean，在容器启动时被创建，可以使用@Lazy注解来延迟初始化（延迟到第一次使用时）。
prototype的bean，每一次使用该bean的时候都会创建一个新的实例。
实际开发当中，绝大部分的Bean是单例的，也就是说绝大部分Bean不需要配置scope属性。

 */
@SpringBootTest
public class Bean作用域 {
    @Autowired
    private Mybean mybean1;

    @Autowired
    private Mybean mybean2;

    @Test
    public void testScope() {
        //观察打印地址变化
        System.err.println(mybean1);
        System.err.println(mybean2);

        //@Scope("singleton")
        //com.itheima.Mybean@668cc9a2
        //com.itheima.Mybean@668cc9a2 是同一个对象

        //@Scope("prototype")
        //com.itheima.Mybean@79627d27
        //com.itheima.Mybean@6371cf2f 是不同对象


    }

}
